// src/utils/request.js
import axios from 'axios';
import { ElMessage } from 'element-plus'; // 确保你已经正确安装并导入了 Element Plus

const service = axios.create({
  // *** 微服务架构配置：使用API网关作为统一入口 ***
  // API网关地址：http://localhost:8081
  // 网关会自动路由到相应的微服务
  baseURL: 'http://localhost:8081',
  timeout: 30000, // 请求超时时间
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 可以在这里添加认证 token 等
    const token = localStorage.getItem('token'); // 示例：从本地存储获取 token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`; // 添加 Authorization 头
    }
    return config;
  },
  (error) => {
    console.error('请求拦截器捕获到错误:', error);
    // 这里通常不需要 ElMessage 提示，因为请求还没发出去，或者是请求配置的问题
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // *** 保持这个修改：直接返回 response.data ***
    // 这意味着你的组件将直接收到后端返回的 JSON 数据（或任何原始响应体）
    // 而不是 { status, data, headers, ... } 这样的 Axios 响应对象。
    // 如果后端有统一的响应格式（如 { code, msg, data }），你会在组件中自行解构。
    return response.data;
  },
  (error) => {
    // 处理HTTP错误（例如网络不通，请求超时，服务器返回 4xx/5xx 状态码等）
    console.error('响应拦截器捕获到HTTP错误:', error);

    let errorMessage = '请求失败，请检查网络或联系管理员';

    if (error.response) {
      // 服务器有响应，但状态码非 2xx
      const status = error.response.status;
      const data = error.response.data; // 后端返回的错误详情

      switch (status) {
        case 400: errorMessage = data.message || '请求参数错误'; break;
        case 401: errorMessage = data.message || '未授权，请重新登录'; break;
        case 403: errorMessage = data.message || '无权限访问'; break;
        case 404: errorMessage = data.message || '请求地址不存在'; break; // 后端 404 往往有自己的 message
        case 500: errorMessage = data.message || '服务器内部错误'; break;
        default: errorMessage = data.message || `HTTP错误：${status}`;
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应（例如网络断开、CORS 预检请求失败等）
      errorMessage = '网络连接异常，请稍后重试';
    } else {
      // 发送请求前的错误 (例如请求配置问题)
      errorMessage = error.message || '请求配置错误';
    }

    ElMessage({
      message: errorMessage,
      type: 'error',
      duration: 5 * 1000,
    });
    return Promise.reject(error); // 继续抛出错误，以便组件中的 catch 块能捕获到
  }
);

export default service;
